perm filename MATCHR.L70[L70,TES] blob
sn#029354 filedate 1973-03-09 generic text, type T, neo UTF8
00100 <FN PATTERN1 → PATTERN2>
00200 CALLS FN WITH THE INPUT STREAM PATTERN1
00300 BINDS ITS RESULT TO THE OUTPUT STREAM PATTERN2
00400
00500 IN A DEC, THE ADDITIONAL VARIABLES :SOURCE AND ::SOURCE ARE
00600 AVAILABLE TO REPRESENT ONE ELEMENT OF THE SOURCE AND
00700 AS MANY ELEMENTS AS DESIRED OF THE SOURCE RESPECTIVELY.
00800
00900 IN A REC, THE ADDITIONAL VARIABLES :SINK AND ::SINK ARE
01000 AVAILABLE TO REPRESENT ONE ELEMENT OF THE SINK AND
01100 AS MANY ELEMENTS AS DESIRED OF THE SINK RESPECTIVELY.
01200
01300 IF EITHER PATTERN1 OR PATTERN2 IS COMPLETELY EMPTY, THEN
01400 THE DEFAULT IS ::SOURCE IN THE DEC AND ::SINK IN THE REC.
01500 ALSO ITEM@FN IS AN ABBREVIATION FOR <FN ITEM>.
01600 THUS, THE OLD NOTATION IS COMPATIBLE.
01700 BUT WE SHOULD STOP USING @ AND DISCOURAGE THE USE OF <FN>:X.
01800
01900 TO REVERSE A RULE,
02000 <FN :SOURCE B → C ::SOURCE>
02100 CHANGES TO
02200 <<INVERSE FN> C ::SINK → :SINK B>.
02300 NOTE- C ::SINK MEANS THE ATOM C AND THEN SOME THINGS THAT ARE ABOUT TO GO
02400 ONTO THE SINK.
02500
02600 RULES OF EXPRESSION =
02700 IF <EXPRESSION→:X> THEN <EXPRESSION→:Y> ELSE <EXPRESSION→:Z>
02800 → (COND (:X :Y)(T :Z)) ;
02900
03000 RULES OF INVERSE EXPRESSION =
03100 (COND (:X :Y)(T :Z))
03200 IF <<INVERSE EXPRESSION> :X> THEN <<INVERSE EXPRESSION> :Y>
03300 ELSE <<INVERSE EXPRESSION>:Y> ;
03400
03500 RULES OF OPTIMIZE =
03600 [<PEEPHOLE>|:X]* → ::X ;
03700
03800 RULES OF ALT =
03900 (... :X ...) ::STR → <MATCH :X ::STR> ;
04000
04100 RULES OF MATCH =
04200 (LITERAL :X) :X → ,
04300 (COLON :X) :Y #WHERE# ALIST=(... (:X :Y)...) → ,
04400 (COLON :X) :Y #WHERE# ALIST=(... (:X :Z)...) → <FAILURE>,
04500 (COLON :X) :Y → #WHERE# ALIST = (##(ALIST) (:X :Y)),
04600 (CALL :FN :INS :OUTS) :Y #WHERE# FUNCTIONS= (... (:FN :RULE)...)
04700 → <MATCH :OUTS <APPLY :RULE :INS>>,
04800 ETC. ;
04900
05000 RULES OF APPLY =
05100 (LAMDA .. ..) → .....,
05200 (REWRITE :DEC :REC) <MATCH :DEC ::STREAM → #WHERE# ALIST=:A>
05300 → <EVAL :REC :A> ;
05400
05500 RULES OF EVAL =
05600 (:FN ...) → <APPLY :FN ...>,
05700 :X #WHERE# ALIST=(... (:X :V)...) → :V ;